<?php
/**
 * klasa ładująca pliki zawierające odpowiednie klasy
 *
 * dzięki niej nie trzeba pamiętać o garści include'ów w nagłówku każdego pliku i można dość dowolnie zmieniać położenie plików w trakcie pracy nad projektem
 * <br>klasa do ładowania plików wykorzystuje mechanizm spl_autoload
 */
class Loader {
	/**
	 * tablica z częściowymi nazwami funkcji ładujących
	 *	@access private
	 * 	@internal
	 * 	@var string[]
	 */
	private static $loaders = array('Main', 'Include', 'Model', 'Part');
	/**
	 * ogólna funkcja służąca za podstawę każdej funkcji ładującej
	 * 
	 * jako, że nie ma potrzeby robić dodatkowej magii, to nazwy klas i plików muszą być takie same
	 * <br>chyba, że z jakiegoś powodu chcemy, by kilka klas było w jednym pliku, to trzeba zadbać o odpowiednią nazwę - nazwę pliku powinna stanowić nazwa klasy używana jako pierwsza
	 * @param string $className nazwa klasy i jednocześnie ładowanego pliku
	 * @param string $directory katalog, z jakiego klasa ma być ładowana, domyślnie pusty
	 */
	private static function loadDirectory ($className, $directory = '') {
		$className = self::extractClassName($className);
		$fileName = './'.$directory.'/'.$className.'.php';
		if(file_exists($fileName)) {
			include_once($fileName);
		}
	}
	/**
	 * z powodu użycia przestrzeni nazw trzeba wyciągnąć nazwę samej klasy z "ścieżki do niej"
	 * @param string ścieżka do klasy
	 * @return string zwraca samą nazwę klasy
	 */
	private static function extractClassName ($classPath) {
		$classPath = explode('\\', $classPath);
		return $classPath[count($classPath)-1];
	}
	/**
	 * ładuje klasę z głównego katalogu
	 */
	public static function loadMain ($className) {
		self::loadDirectory($className);
	}
	/**
	 * ładuję klasę modelu
	 */
	public static function loadModel ($className) {
		self::loadDirectory($className, 'models');
	}
	/**
	 * ładuje klasę z katalogu includes
	 */
	public static function loadInclude ($className) {
		self::loadDirectory($className, 'includes');
	}
	/**
	 * ładuje klasę "części" - kawałka kodu html strony
	 */ 
	public static function loadPart ($className) {
		self::loadDirectory($className, 'theme/parts');
	}
	/**
	 * rejestruje wszystkie funkcje ładujące
	 */
	public static function register () {
		$l = count(self::$loaders);
		for($i=0; $i<$l; $i++) {
			spl_autoload_register('Loader::load'.self::$loaders[$i]);
		}
		self::loadInclude('Controller');
	}
}
?>